import { useParams } from 'common'
import { ChevronDown, FolderOpen, Settings, Shield, Trash2 } from 'lucide-react'
import Link from 'next/link'
import { useRouter } from 'next/router'
import { parseAsBoolean, useQueryState } from 'nuqs'
import { useEffect } from 'react'
import { toast } from 'sonner'
import {
Badge,
Button,
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
Tooltip,
TooltipContent,
TooltipTrigger,
} from 'ui'
import { DeleteBucketModal } from '@/components/interfaces/Storage/DeleteBucketModal'
import { EditBucketModal } from '@/components/interfaces/Storage/EditBucketModal'
import { EmptyBucketModal } from '@/components/interfaces/Storage/EmptyBucketModal'
import { useSelectedBucket } from '@/components/interfaces/Storage/FilesBuckets/useSelectedBucket'
import { PublicBucketWarning } from '@/components/interfaces/Storage/PublicBucketWarning'
import { PUBLIC_BUCKET_TOOLTIP } from '@/components/interfaces/Storage/Storage.constants'
import StorageBucketsError from '@/components/interfaces/Storage/StorageBucketsError'
import { StorageExplorer } from '@/components/interfaces/Storage/StorageExplorer/StorageExplorer'
import { useBucketPolicyCount } from '@/components/interfaces/Storage/useBucketPolicyCount'
import DefaultLayout from '@/components/layouts/DefaultLayout'
import { PageLayout } from '@/components/layouts/PageLayout/PageLayout'
import StorageLayout from '@/components/layouts/StorageLayout/StorageLayout'
import { StorageExplorerStateContextProvider } from '@/state/storage-explorer'
import type { NextPageWithLayout } from '@/types'
const BucketPage: NextPageWithLayout = () => {
const router = useRouter()
const { bucketId, ref } = useParams()
const { data: bucket, error, isSuccess, isError } = useSelectedBucket()
const [showEditModal, setShowEditModal] = useQueryState(
'edit',
parseAsBoolean.withDefault(false).withOptions({ history: 'push', clearOnDefault: true })
)
const [showEmptyModal, setShowEmptyModal] = useQueryState(
'empty',
parseAsBoolean.withDefault(false).withOptions({ history: 'push', clearOnDefault: true })
)
const [showDeleteModal, setShowDeleteModal] = useQueryState(
'delete',
parseAsBoolean.withDefault(false).withOptions({ history: 'push', clearOnDefault: true })
)
const { getPolicyCount } = useBucketPolicyCount()
const policyCount = bucket ? getPolicyCount(bucket.id) : 0
useEffect(() => {
if (isSuccess && !bucket) {
toast.info(`Bucket "${bucketId}" does not exist in your project`)
router.push(`/project/${ref}/storage/files`)
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [isSuccess])
if (isError) {
return
}
return (
{bucketId}
{bucket?.public && (
Public
{PUBLIC_BUCKET_TOOLTIP}
)}
}
breadcrumbs={[
{
label: 'Files',
href: `/project/${ref}/storage/files`,
},
{
label: 'Buckets',
href: `/project/${ref}/storage/files`,
},
]}
primaryActions={
<>
}
iconRight={
policyCount > 0 ? (
{policyCount}
) : undefined
}
>
Policies
}>
Edit bucket
setShowEditModal(true)}
>
Bucket settings
setShowEmptyModal(true)}
>
Empty bucket
setShowDeleteModal(true)}
>
Delete bucket
>
}
>
{bucket && (
<>
setShowEditModal(false)}
/>
setShowEmptyModal(false)}
/>
setShowDeleteModal(false)}
/>
>
)}
)
}
BucketPage.getLayout = (page) => (
{page}
)
export default BucketPage